package com.xd.common.base;

import com.baomidou.mybatisplus.extension.api.IErrorCode;
import com.xd.common.model.R;
import com.xd.common.vo.ApiErrorCode;
import lombok.extern.slf4j.Slf4j;

import java.util.function.Function;
import java.util.function.Predicate;

/**
 * REST API 通用控制器
 *
 * @author hubin
 * @since 2018-06-08
 */
@Slf4j
public class ApiController {


    /**
     * 请求成功
     *
     * @param data 数据内容
     * @param <T>  对象泛型
     * @return ignore
     */
    protected <T> R<T> success(T data) {
        return R.ok(data);
    }


    /**
     * 返回结果
     *
     * @param function 数据内容
     * @param data     判断的对象
     * @return ignore
     */
    protected <T> R<T> result(Function<T, R<T>> function, T data) {
        return function.apply(data);
    }


    /**
     * 返回结果
     *
     * @param predicate    数据内容
     * @param data         判断的对象
     * @param apiErrorCode 如果错误,返回的状态码
     * @return ignore
     */
    protected <T> R<T> result(Predicate<T> predicate, T data, ApiErrorCode apiErrorCode) {
        return predicate.test(data) ? R.ok(data) : R.failed(apiErrorCode);
    }

    /**
     * 返回结果
     *
     * @param predicate 数据内容
     * @param data      判断的对象
     * @param msg       如果错误,返回的信息
     * @return ignore
     */
    protected <T> R<T> result(Predicate<T> predicate, T data, String msg) {
        return predicate.test(data) ? R.ok(data) : R.failed(msg);
    }

    /**
     * 请求失败
     *
     * @param msg 提示内容
     * @return ignore
     */
    protected <T> R<T> failed(String msg) {
        return R.failed(msg);
    }

    /**
     * 请求失败
     *
     * @param errorCode 请求错误码
     * @return ignore
     */
    protected <T> R<T> failed(IErrorCode errorCode) {
        return R.failed(errorCode);
    }


}
